Kotlin এ Object-Oriented Programming (OOP)
কটলিন একটি Object-Oriented Programming (OOP) সমর্থিত ভাষা। এতে ক্লাস, অবজেক্ট, ইনহেরিটেন্স, পলিমরফিজম, অ্যাবস্ট্রাকশন, এবং এনক্যাপসুলেশন সম্পূর্ণভাবে সমর্থিত। OOP-এর মাধ্যমে প্রোগ্রামিং আরও মডুলার, পুনঃব্যবহারযোগ্য এবং রিডেবল হয়। নিচে কটলিনে OOP সম্পর্কিত গুরুত্বপূর্ণ বিষয়গুলো আলোচনা করা হলো:
১. ক্লাস এবং অবজেক্ট (Class and Object)
ক্লাস হলো কটলিনে একটি ব্লুপ্রিন্ট যা অবজেক্ট তৈরির জন্য ব্যবহৃত হয়। অবজেক্ট হলো ক্লাসের ইনস্ট্যান্স, যা ক্লাসের প্রোপার্টি এবং মেথডগুলো ব্যবহার করতে পারে।
i) ক্লাস ডিক্লারেশন
class Person(val name: String, var age: Int) {
fun greet() {
println("Hello, my name is $name and I am $age years old.")
}
}
ব্যাখ্যা:
class Personদিয়ে একটি ক্লাস ডিক্লেয়ার করা হয়েছে।- ক্লাসটির দুটি প্রোপার্টি (
nameএবংage) রয়েছে, একটিval(immutable) এবং একটিvar(mutable)। greet()হলো একটি মেথড যা ক্লাসের প্রোপার্টি ব্যবহার করে একটি মেসেজ প্রিন্ট করে।
ii) অবজেক্ট তৈরি করা
fun main() {
val person = Person("Alice", 30)
person.greet() // আউটপুট: Hello, my name is Alice and I am 30 years old.
}
- এখানে
Personক্লাস থেকে একটি অবজেক্ট তৈরি করা হয়েছে, এবংgreet()মেথডটি কল করা হয়েছে।
২. কন্সট্রাক্টর (Constructor)
কটলিনে ক্লাসে প্রাইমারি এবং সেকেন্ডারি কন্সট্রাক্টর থাকতে পারে। প্রাইমারি কন্সট্রাক্টরটি ক্লাসের ডিক্লারেশন লাইনে থাকে, আর সেকেন্ডারি কন্সট্রাক্টর ক্লাস বডিতে থাকে।
i) প্রাইমারি কন্সট্রাক্টর
class Car(val brand: String, val model: String, var year: Int)
ব্যাখ্যা:
- এখানে
Carক্লাসে প্রাইমারি কন্সট্রাক্টরের মাধ্যমে তিনটি প্রোপার্টি সেট করা হয়েছে।
ii) সেকেন্ডারি কন্সট্রাক্টর
class Car {
var brand: String
var model: String
var year: Int
constructor(brand: String, model: String, year: Int) {
this.brand = brand
this.model = model
this.year = year
}
}
- এখানে সেকেন্ডারি কন্সট্রাক্টর ব্যবহার করে প্রোপার্টি ইনিশিয়ালাইজ করা হয়েছে।
৩. ইনহেরিটেন্স (Inheritance)
কটলিনে ইনহেরিটেন্স একটি ক্লাসের মধ্যে বৈশিষ্ট্য পুনরায় ব্যবহার করতে দেয়। কটলিনে ক্লাসগুলো ডিফল্টভাবে final থাকে, তাই এগুলোকে ইনহেরিট করতে চাইলে open কীওয়ার্ড ব্যবহার করতে হয়।
উদাহরণ:
open class Animal(val name: String) {
open fun sound() {
println("Animal sound")
}
}
class Dog(name: String) : Animal(name) {
override fun sound() {
println("Bark")
}
}
ব্যাখ্যা:
Animalহলো একটি বেস ক্লাস যাopenকীওয়ার্ড দিয়ে ডিক্লেয়ার করা হয়েছে।sound()মেথডটিওopen, যাতে সাবক্লাস এটি ওভাররাইড করতে পারে।Dogক্লাসটিAnimalক্লাস থেকে ইনহেরিট করে এবংsound()মেথড ওভাররাইড করে।
৪. পলিমরফিজম (Polymorphism)
পলিমরফিজম ইনহেরিট করা ক্লাসগুলোতে মেথড বা ফাংশন ওভাররাইড করার মাধ্যমে কাজ করে। এটি ক্লাসের বিভিন্ন ফর্ম বা রূপ তৈরি করতে সাহায্য করে।
উদাহরণ:
fun main() {
val animal: Animal = Dog("Rex")
animal.sound() // আউটপুট: Bark
}
- এখানে,
animalভ্যারিয়েবলটিAnimalটাইপ হলেও এটিDogক্লাসের ইনস্ট্যান্স ধারণ করে। এটিDogক্লাসেরsound()মেথড এক্সিকিউট করে।
৫. অ্যাবস্ট্রাকশন (Abstraction)
কটলিনে অ্যাবস্ট্রাকশন তৈরি করার জন্য abstract ক্লাস ব্যবহার করা হয়। abstract ক্লাসে abstract মেথড থাকতে পারে, যা সাবক্লাসে ইমপ্লিমেন্ট করতে হয়।
উদাহরণ:
abstract class Vehicle {
abstract fun start()
}
class Bike : Vehicle() {
override fun start() {
println("Bike started")
}
}
ব্যাখ্যা:
Vehicleহলো একটিabstractক্লাস, যেখানেstart()মেথডটিabstractহিসেবে ডিক্লেয়ার করা হয়েছে।Bikeক্লাসটিVehicleক্লাস ইনহেরিট করে এবংstart()মেথড ইমপ্লিমেন্ট করে।
৬. এনক্যাপসুলেশন (Encapsulation)
এনক্যাপসুলেশন হলো প্রোপার্টি এবং মেথডগুলোকে একটি ক্লাসের মধ্যে আবদ্ধ করে রাখা, যাতে বাইরের ক্লাস সরাসরি এগুলোর এক্সেস না পায়। কটলিনে ভিজিবিলিটি মডিফায়ার ব্যবহার করে এনক্যাপসুলেশন নিশ্চিত করা যায়।
ভিজিবিলিটি মডিফায়ার:
public: ডিফল্ট ভ্যালু, যা সর্বত্র অ্যাক্সেসযোগ্য।private: শুধুমাত্র সেই ক্লাসের মধ্যেই অ্যাক্সেসযোগ্য।protected: শুধুমাত্র সেই ক্লাস এবং সাবক্লাসে অ্যাক্সেসযোগ্য।internal: মডিউল-লেভেল অ্যাক্সেস।
উদাহরণ:
class Account {
private var balance: Double = 0.0
fun deposit(amount: Double) {
if (amount > 0) {
balance += amount
}
}
fun getBalance(): Double {
return balance
}
}
ব্যাখ্যা:
balanceভ্যারিয়েবলটিprivate, তাই এটি ক্লাসের বাইরে থেকে সরাসরি এক্সেসযোগ্য নয়।deposit()এবংgetBalance()মেথড ব্যবহার করেbalanceভ্যারিয়েবলের মান পরিবর্তন এবং রিট্রিভ করা যায়।
উপসংহার
কটলিনে OOP কনসেপ্টগুলো (ক্লাস, ইনহেরিটেন্স, পলিমরফিজম, অ্যাবস্ট্রাকশন, এবং এনক্যাপসুলেশন) সহজ এবং কার্যকর উপায়ে ইমপ্লিমেন্ট করা যায়। OOP কনসেপ্ট ব্যবহার করে কোড আরও মডুলার, পুনঃব্যবহারযোগ্য এবং রিডেবল হয়।
Classes এবং Objects
কটলিনে Classes এবং Objects হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর মূল ভিত্তি। ক্লাস হলো একটি ব্লুপ্রিন্ট যা অবজেক্ট তৈরি করতে ব্যবহৃত হয়, আর অবজেক্ট হলো সেই ক্লাসের একটি নির্দিষ্ট ইন্সট্যান্স। কটলিনে ক্লাস এবং অবজেক্ট তৈরি করা এবং পরিচালনা করা বেশ সহজ এবং সিম্পল। নিচে ক্লাস এবং অবজেক্ট নিয়ে বিস্তারিত আলোচনা করা হলো:
১. ক্লাস (Class)
ক্লাস হলো একটি ব্লুপ্রিন্ট বা টেমপ্লেট যা ডেটা এবং ফাংশন (মেথড) ধারণ করে। এর মাধ্যমে আপনি একটি নির্দিষ্ট ডেটা টাইপ এবং তার সাথে সম্পর্কিত অপারেশনগুলো নির্ধারণ করতে পারেন।
i) ক্লাস ডিক্লারেশন
কটলিনে একটি ক্লাস ডিক্লারেশন করতে class কীওয়ার্ড ব্যবহার করা হয়।
উদাহরণ:
class Person {
// প্রোপার্টিজ
var name: String = ""
var age: Int = 0
// মেথড
fun displayInfo() {
println("Name: $name, Age: $age")
}
}
ব্যাখ্যা:
Personহলো একটি ক্লাস যেখানে দুটি প্রোপার্টি (nameএবংage) এবং একটি মেথড (displayInfo) আছে।- মেথডটি
nameএবংageপ্রোপার্টিগুলো প্রিন্ট করে।
ii) ক্লাস থেকে অবজেক্ট তৈরি
একটি ক্লাস থেকে অবজেক্ট তৈরি করা হলে সেই ক্লাসের প্রোপার্টি এবং মেথডগুলো অবজেক্টের সাথে অ্যাক্সেস করা যায়।
উদাহরণ:
fun main() {
val person = Person()
person.name = "Alice"
person.age = 25
person.displayInfo() // আউটপুট: Name: Alice, Age: 25
}
ব্যাখ্যা:
Person()এর মাধ্যমে একটি নতুন অবজেক্ট তৈরি করা হয়েছে এবং সেটিpersonভ্যারিয়েবলে অ্যাসাইন করা হয়েছে।- এরপর, অবজেক্টের প্রোপার্টি সেট করা হয়েছে এবং মেথড কল করে ইনফরমেশন প্রিন্ট করা হয়েছে।
২. কনস্ট্রাক্টর (Constructor)
কটলিনে ক্লাসে ডিফল্টভাবে একটি প্রাইমারি কনস্ট্রাক্টর থাকে যা প্রোপার্টিগুলো ইনিশিয়ালাইজ করতে ব্যবহৃত হয়।
i) প্রাইমারি কনস্ট্রাক্টর
ক্লাসের সাথে সরাসরি প্রাইমারি কনস্ট্রাক্টর ডিক্লেয়ার করা যায়।
উদাহরণ:
class Person(val name: String, var age: Int) {
fun displayInfo() {
println("Name: $name, Age: $age")
}
}
ব্যাখ্যা:
- এখানে
nameএবংageপ্রোপার্টি প্রাইমারি কনস্ট্রাক্টরের মধ্যে ডিক্লেয়ার করা হয়েছে।
ii) অবজেক্ট তৈরি করার সময় কনস্ট্রাক্টর ব্যবহার করা
fun main() {
val person = Person("Bob", 30)
person.displayInfo() // আউটপুট: Name: Bob, Age: 30
}
ব্যাখ্যা:
Person("Bob", 30)এর মাধ্যমে কনস্ট্রাক্টর কল করা হয়েছে এবং প্রোপার্টিগুলো ইনিশিয়ালাইজ করা হয়েছে।
৩. সেকেন্ডারি কনস্ট্রাক্টর
কটলিনে আপনি প্রাইমারি কনস্ট্রাক্টর ছাড়াও সেকেন্ডারি কনস্ট্রাক্টর ব্যবহার করতে পারেন। এটি তখন ব্যবহার করা হয় যখন আপনি ক্লাসের ভিন্ন ভিন্ন ইনিশিয়ালাইজেশন করতে চান।
উদাহরণ:
class Person {
var name: String
var age: Int
// প্রাইমারি কনস্ট্রাক্টর নেই, তবে সেকেন্ডারি কনস্ট্রাক্টর আছে
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
fun displayInfo() {
println("Name: $name, Age: $age")
}
}
fun main() {
val person = Person("Charlie", 28)
person.displayInfo() // আউটপুট: Name: Charlie, Age: 28
}
ব্যাখ্যা:
- এখানে
constructorকীওয়ার্ড ব্যবহার করে সেকেন্ডারি কনস্ট্রাক্টর ডিক্লেয়ার করা হয়েছে, যেখানে প্রোপার্টিগুলো ইনিশিয়ালাইজ করা হয়েছে।
৪. ইনহেরিটেন্স (Inheritance)
কটলিনে ইনহেরিটেন্স ব্যবহার করে একটি ক্লাস অন্য ক্লাস থেকে প্রোপার্টি এবং মেথডগুলো ইনহেরিট করতে পারে।
উদাহরণ:
open class Animal(val name: String) {
fun eat() {
println("$name is eating.")
}
}
class Dog(name: String, val breed: String) : Animal(name) {
fun bark() {
println("$name is barking.")
}
}
fun main() {
val dog = Dog("Max", "Labrador")
dog.eat() // আউটপুট: Max is eating.
dog.bark() // আউটপুট: Max is barking.
}
ব্যাখ্যা:
Animalহলো একটি ওপেন ক্লাস যা ইনহেরিট করা যাবে।Dogক্লাসটিAnimalক্লাসটি ইনহেরিট করছে এবং অতিরিক্ত একটি মেথড (bark) যোগ করছে।
৫. অবজেক্ট (Object)
কটলিনে অবজেক্ট হলো একটি নির্দিষ্ট ক্লাসের ইন্সট্যান্স। আপনি সরাসরি অবজেক্ট তৈরি করতে পারেন এবং এটি একটি সিঙ্গেলটন অবজেক্ট হতে পারে।
i) সিঙ্গেলটন অবজেক্ট
কটলিনে object কীওয়ার্ড ব্যবহার করে সিঙ্গেলটন অবজেক্ট তৈরি করা যায়।
উদাহরণ:
object Singleton {
var counter: Int = 0
fun increment() {
counter++
}
}
fun main() {
Singleton.increment()
Singleton.increment()
println(Singleton.counter) // আউটপুট: 2
}
ব্যাখ্যা:
Singletonঅবজেক্টে একটি প্রোপার্টি (counter) এবং একটি মেথড (increment) আছে।- এই অবজেক্টের মেথড কল করে আমরা ভ্যালু পরিবর্তন করতে পারি, যা একই রেফারেন্স থেকে অ্যাক্সেস করা হয়।
উপসংহার
কটলিনে Classes এবং Objects প্রোগ্রামের মূল কাঠামো তৈরি করতে ব্যবহৃত হয়। ক্লাসের মাধ্যমে আপনি প্রোপার্টি এবং মেথড ডিফাইন করতে পারেন, যা অবজেক্টের মাধ্যমে অ্যাক্সেস করা যায়। ইনহেরিটেন্স এবং কনস্ট্রাক্টর ব্যবহার করে আরও জটিল এবং পুনঃব্যবহারযোগ্য কোড তৈরি করা যায়। সিঙ্গেলটন অবজেক্ট তৈরি করেও একটি নির্দিষ্ট অবজেক্টকে শেয়ার করা যায়।
Constructors এবং Initializers
কটলিনে Constructors এবং Initializers ব্যবহার করে ক্লাসের অবজেক্ট তৈরি এবং প্রাথমিক মান সেট করা হয়। কটলিনে দুটি ধরনের কন্সট্রাক্টর রয়েছে: Primary Constructor এবং Secondary Constructor। এছাড়া, Initializer Blocks ব্যবহার করে অবজেক্টের ইনিশিয়াল স্টেট সেট করা যায়। নিচে এই কনসেপ্টগুলো নিয়ে বিস্তারিত আলোচনা করা হলো:
১. Primary Constructor
কটলিনে প্রাইমারি কন্সট্রাক্টর হলো ক্লাসের প্রধান কন্সট্রাক্টর, যা ক্লাস ডিক্লারেশনের সাথে সরাসরি যুক্ত থাকে। প্রাইমারি কন্সট্রাক্টর সাধারণত প্রোপার্টিগুলো ইনিশিয়ালাইজ করার জন্য ব্যবহৃত হয়।
উদাহরণ:
class Person(val name: String, var age: Int)
ব্যাখ্যা:
- এখানে
Personক্লাসের প্রাইমারি কন্সট্রাক্টরnameএবংageনামে দুটি প্রোপার্টি গ্রহণ করে। - প্রাইমারি কন্সট্রাক্টর সরাসরি ক্লাস ডিক্লারেশনের সাথে সংযুক্ত থাকে এবং এতে বডি থাকে না।
প্রাইমারি কন্সট্রাক্টরের সাথে ইনিশিয়ালাইজেশন:
class Person(val name: String, var age: Int) {
init {
println("Person created with name: $name and age: $age")
}
}
ব্যাখ্যা:
initব্লক প্রাইমারি কন্সট্রাক্টরের সাথে সম্পর্কিত। যখন ক্লাসের অবজেক্ট তৈরি হয়, তখনinitব্লকের কোড এক্সিকিউট হয়।- এখানে,
initব্লকে প্রাথমিক মেসেজ প্রিন্ট করা হচ্ছে।
২. Secondary Constructor
কটলিনে সেকেন্ডারি কন্সট্রাক্টর ব্যবহার করা হয় অতিরিক্ত ইনিশিয়ালাইজেশন লজিক প্রয়োগ করতে, যা প্রাইমারি কন্সট্রাক্টর দ্বারা সরাসরি সমাধান করা যায় না। একটি ক্লাসে একাধিক সেকেন্ডারি কন্সট্রাক্টর থাকতে পারে।
উদাহরণ:
class Person(val name: String) {
var age: Int = 0
constructor(name: String, age: Int) : this(name) {
this.age = age
}
}
ব্যাখ্যা:
- এখানে
Personক্লাসের প্রাইমারি কন্সট্রাক্টর একটি প্যারামিটার (name) নেয়। - সেকেন্ডারি কন্সট্রাক্টর
nameএবংageনামে দুটি প্যারামিটার নেয়, এবং প্রাইমারি কন্সট্রাক্টরকে কল করে (: this(name)), তারপরageপ্রোপার্টি সেট করে।
৩. Initializer Blocks
Initializer Block হলো একটি ব্লক যা প্রাইমারি কন্সট্রাক্টরের পরে এক্সিকিউট হয়। এটি ইনিশিয়ালাইজেশন লজিক প্রয়োগ করতে ব্যবহৃত হয়, যা প্রাইমারি কন্সট্রাক্টরের বাইরে রাখতে হয়।
উদাহরণ:
class Employee(val name: String, val salary: Double) {
init {
println("Employee name: $name, Salary: $salary")
}
}
ব্যাখ্যা:
Employeeক্লাসের প্রাইমারি কন্সট্রাক্টরে দুটি প্রোপার্টি আছে:nameএবংsalary।initব্লকটি অবজেক্ট তৈরি হলে ইনিশিয়ালাইজ হয় এবং প্রাথমিক মেসেজ প্রিন্ট করে।
বেশি ইনিশিয়ালাইজার ব্লক ব্যবহার:
class Product(val name: String, val price: Double) {
init {
println("Product created: $name")
}
init {
println("Price: $price")
}
}
ব্যাখ্যা:
- একটি ক্লাসে একাধিক
initব্লক থাকতে পারে, এবং এগুলো উপরের ক্রম অনুযায়ী এক্সিকিউট হয়।
৪. প্রাইমারি এবং সেকেন্ডারি কন্সট্রাক্টরের সমন্বয়
আপনি প্রাইমারি এবং সেকেন্ডারি কন্সট্রাক্টর একসাথে ব্যবহার করে ক্লাসে আরও ফ্লেক্সিবল ইনিশিয়ালাইজেশন করতে পারেন।
উদাহরণ:
class Vehicle(val model: String) {
var year: Int = 0
init {
println("Vehicle model: $model")
}
constructor(model: String, year: Int) : this(model) {
this.year = year
println("Vehicle year: $year")
}
}
fun main() {
val car1 = Vehicle("Toyota")
val car2 = Vehicle("Honda", 2020)
}
ব্যাখ্যা:
- এখানে
Vehicleক্লাসে একটি প্রাইমারি এবং একটি সেকেন্ডারি কন্সট্রাক্টর আছে। car1অবজেক্ট প্রাইমারি কন্সট্রাক্টর ব্যবহার করে তৈরি হয়েছে এবং শুধুমাত্র মডেল সেট হয়েছে।car2অবজেক্ট সেকেন্ডারি কন্সট্রাক্টর ব্যবহার করে তৈরি হয়েছে এবং মডেল ও বছরের তথ্য সেট হয়েছে।
উপসংহার
কটলিনে Constructors এবং Initializers ব্যবহার করে ক্লাসের অবজেক্ট তৈরি করা এবং প্রাথমিক মান সেট করা খুবই সহজ এবং সংক্ষিপ্ত। প্রাইমারি কন্সট্রাক্টর সাধারণত সাধারণ এবং সরাসরি ইনিশিয়ালাইজেশন কাজ করে, যেখানে সেকেন্ডারি কন্সট্রাক্টর অতিরিক্ত লজিক প্রয়োগে সহায়ক। Initializer Blocks ব্যবহার করে আপনি আরও জটিল ইনিশিয়ালাইজেশন কাজ করতে পারেন।
Inheritance এবং Polymorphism
কটলিনে Inheritance এবং Polymorphism হলো অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং (OOP) এর দুটি প্রধান কনসেপ্ট। এগুলো ব্যবহার করে আপনি কোড পুনঃব্যবহারযোগ্য, সম্প্রসারণযোগ্য, এবং আরো ফ্লেক্সিবল করতে পারেন। নিচে Inheritance এবং Polymorphism নিয়ে বিস্তারিত আলোচনা করা হলো:
১. Inheritance (ইনহেরিটেন্স)
Inheritance হলো একটি প্রক্রিয়া যার মাধ্যমে একটি ক্লাস অন্য একটি ক্লাসের প্রোপার্টি এবং মেথডগুলো ইনহেরিট করে। ইনহেরিটেন্স ব্যবহার করে আপনি কোড পুনরায় ব্যবহার করতে পারেন এবং ক্লাসের কার্যকারিতা সম্প্রসারণ করতে পারেন।
i) কটলিনে ইনহেরিটেন্স
কটলিনে একটি ক্লাস ইনহেরিট করার জন্য বেস ক্লাসটিকে open কীওয়ার্ড দিয়ে চিহ্নিত করতে হয়। ডিফল্টভাবে, কটলিনে সব ক্লাস final, অর্থাৎ ইনহেরিট করা যায় না।
উদাহরণ:
open class Animal(val name: String) {
fun eat() {
println("$name is eating.")
}
}
class Dog(name: String, val breed: String) : Animal(name) {
fun bark() {
println("$name is barking.")
}
}
fun main() {
val dog = Dog("Max", "Labrador")
dog.eat() // আউটপুট: Max is eating.
dog.bark() // আউটপুট: Max is barking.
}
ব্যাখ্যা:
Animalহলো একটি ওপেন ক্লাস যা ইনহেরিট করা যাবে। এটি একটি প্রোপার্টি (name) এবং একটি মেথড (eat) ধারণ করে।Dogক্লাসটিAnimalক্লাসটি ইনহেরিট করছে এবং একটি অতিরিক্ত প্রোপার্টি (breed) এবং একটি মেথড (bark) যোগ করছে।
ii) মেথড ওভাররাইডিং
কটলিনে বেস ক্লাসের মেথড ওভাররাইড করতে হলে বেস ক্লাসের মেথডটিকে open করতে হয় এবং ডেরাইভড ক্লাসে override কীওয়ার্ড ব্যবহার করতে হয়।
উদাহরণ:
open class Animal(val name: String) {
open fun sound() {
println("$name makes a sound.")
}
}
class Cat(name: String) : Animal(name) {
override fun sound() {
println("$name meows.")
}
}
fun main() {
val cat = Cat("Whiskers")
cat.sound() // আউটপুট: Whiskers meows.
}
ব্যাখ্যা:
soundমেথডটিAnimalক্লাসে ওপেন করা হয়েছে।Catক্লাসেsoundমেথডটি ওভাররাইড করা হয়েছে, ফলে একই মেথড ভিন্নভাবে কাজ করছে।
২. Polymorphism (পলিমরফিজম)
Polymorphism হলো একটি ধারণা যেখানে একটি মেথড বা অবজেক্ট একাধিক ফর্ম ধারণ করতে পারে। কটলিনে Polymorphism এর মাধ্যমে আপনি একই মেথডকে বিভিন্নভাবে ইমপ্লিমেন্ট করতে পারেন এবং ভিন্ন ভিন্ন ক্লাসে একই ইন্টারফেস বা বেস ক্লাস ব্যবহার করতে পারেন।
i) মেথড ওভাররাইডিং এবং পলিমরফিজম
মেথড ওভাররাইডিং Polymorphism এর একটি উদাহরণ যেখানে বেস ক্লাসের মেথড ডেরাইভড ক্লাসে ভিন্নভাবে কাজ করে।
উদাহরণ:
open class Animal {
open fun makeSound() {
println("Animal makes a sound")
}
}
class Dog : Animal() {
override fun makeSound() {
println("Dog barks")
}
}
class Cat : Animal() {
override fun makeSound() {
println("Cat meows")
}
}
fun main() {
val animals: List<Animal> = listOf(Dog(), Cat())
for (animal in animals) {
animal.makeSound()
}
}
ব্যাখ্যা:
- এখানে,
Animalক্লাসেmakeSoundমেথড ওপেন করা হয়েছে। DogএবংCatক্লাসে এটি ওভাররাইড করা হয়েছে।animalsলিস্টে ভিন্ন ভিন্ন টাইপের অবজেক্ট (DogএবংCat) রাখা হয়েছে, কিন্তু তারা সবাইAnimalটাইপ হিসেবে চিহ্নিত।- Polymorphism এর মাধ্যমে একই
makeSoundমেথড বিভিন্ন ফর্ম ধারণ করছে।
ii) ইন্টারফেস ব্যবহার করে Polymorphism
ইন্টারফেস ব্যবহার করে আপনি একাধিক ক্লাসে একই মেথড ইমপ্লিমেন্ট করতে পারেন, যা Polymorphism এর আরও একটি উদাহরণ।
উদাহরণ:
interface Shape {
fun draw()
}
class Circle : Shape {
override fun draw() {
println("Drawing a circle")
}
}
class Rectangle : Shape {
override fun draw() {
println("Drawing a rectangle")
}
}
fun main() {
val shapes: List<Shape> = listOf(Circle(), Rectangle())
for (shape in shapes) {
shape.draw()
}
}
ব্যাখ্যা:
Shapeইন্টারফেসে একটি মেথডdrawডিক্লেয়ার করা হয়েছে।CircleএবংRectangleক্লাসেdrawমেথড ইমপ্লিমেন্ট করা হয়েছে।shapesলিস্টেCircleএবংRectangleউভয়ইShapeটাইপ হিসেবে চিহ্নিত।- Polymorphism এর মাধ্যমে একই
drawমেথড বিভিন্ন ফর্ম ধারণ করছে এবং প্রিন্ট করছে।
৩. অ্যাবস্ট্রাক্ট ক্লাস (Abstract Class)
কটলিনে অ্যাবস্ট্রাক্ট ক্লাসও ইনহেরিটেন্স এবং Polymorphism এর একটি উপায়। অ্যাবস্ট্রাক্ট ক্লাস এমন একটি ক্লাস যা ইন্সট্যান্স তৈরি করা যায় না এবং এটি কিছু অ্যাবস্ট্রাক্ট মেথড ধারণ করে যেগুলো ডেরাইভড ক্লাসে ইমপ্লিমেন্ট করতে হয়।
উদাহরণ:
abstract class Vehicle(val name: String) {
abstract fun start()
}
class Car(name: String) : Vehicle(name) {
override fun start() {
println("$name is starting with a key.")
}
}
class Bike(name: String) : Vehicle(name) {
override fun start() {
println("$name is starting with a kick.")
}
}
fun main() {
val car = Car("Toyota")
val bike = Bike("Honda")
car.start() // আউটপুট: Toyota is starting with a key.
bike.start() // আউটপুট: Honda is starting with a kick.
}
ব্যাখ্যা:
Vehicleহলো একটি অ্যাবস্ট্রাক্ট ক্লাস যাতে একটি অ্যাবস্ট্রাক্ট মেথডstartআছে।CarএবংBikeক্লাস এই অ্যাবস্ট্রাক্ট ক্লাসটি ইনহেরিট করে এবংstartমেথড ইমপ্লিমেন্ট করে।
উপসংহার
কটলিনে Inheritance এবং Polymorphism কোডের পুনঃব্যবহারযোগ্যতা, সম্প্রসারণযোগ্যতা, এবং ফ্লেক্সিবিলিটি বাড়াতে সাহায্য করে। ইনহেরিটেন্স ব্যবহার করে আপনি কোডের কার্যকারিতা বাড়াতে পারেন এবং Polymorphism এর মাধ্যমে একই মেথড বা ইন্টারফেসের বিভিন্ন ইমপ্লিমেন্টেশন তৈরি করতে পারেন।
Abstract Classes এবং Interfaces
কটলিনে Abstract Classes এবং Interfaces ব্যবহার করে অ্যাবস্ট্রাকশন এবং ফ্লেক্সিবিলিটি আনা যায়। এদের মাধ্যমে আপনি কটলিনে মডুলার, রিইউজেবল এবং মেইনটেইনেবল কোড তৈরি করতে পারেন। এরা দুটোই অ্যাবস্ট্রাকশন তৈরি করতে ব্যবহৃত হলেও এদের মধ্যে কিছু পার্থক্য রয়েছে। নিচে এই দুইটি বিষয়ের উপর বিস্তারিত আলোচনা করা হলো।
১. Abstract Classes
Abstract Classes হলো এমন ক্লাস যেগুলো থেকে সরাসরি অবজেক্ট তৈরি করা যায় না। এগুলো সাধারণত কিছু সাধারণ প্রোপার্টি এবং মেথড ডিফাইন করে, যেগুলোকে সাবক্লাসে ওভাররাইড করে ইমপ্লিমেন্ট করতে হয়। কটলিনে abstract কীওয়ার্ড ব্যবহার করে একটি ক্লাস এবং মেথডকে অ্যাবস্ট্রাক্ট করা হয়।
Abstract Class উদাহরণ:
abstract class Animal {
abstract val name: String
abstract fun sound()
fun eat() {
println("$name is eating.")
}
}
class Dog : Animal() {
override val name: String = "Dog"
override fun sound() {
println("Bark")
}
}
ব্যাখ্যা:
Animalহলো একটিabstractক্লাস যা একটিabstractপ্রোপার্টি (name) এবং একটিabstractমেথড (sound()) ধারণ করে।eat()হলো একটি সাধারণ মেথড যা ইমপ্লিমেন্ট করা হয়েছে এবং এটি সকল সাবক্লাসে ব্যবহৃত হতে পারে।Dogক্লাসটিAnimalথেকে ইনহেরিট করে এবংnameএবংsound()মেথড ইমপ্লিমেন্ট করে।
Abstract Class ব্যবহার কেন?
- যখন কিছু সাধারণ ফাংশনালিটি (যেমন:
eat()) সব সাবক্লাসে শেয়ার করতে হয়, কিন্তু কিছু নির্দিষ্ট ফাংশনালিটি (যেমন:sound()) প্রতিটি সাবক্লাসে আলাদা ভাবে ইমপ্লিমেন্ট করতে হয়। - অ্যাবস্ট্রাক্ট ক্লাস ইনহেরিট করতে হলে কটলিনে সাবক্লাসগুলোকে
openকরতে হয় না, কারণ অ্যাবস্ট্রাক্ট ক্লাস ডিফল্টভাবেopenথাকে।
২. Interfaces
Interfaces হলো এমন এক ধরনের ব্লুপ্রিন্ট যা শুধুমাত্র ফাংশনালিটি ঘোষণা করে। এটি ক্লাস বা অবজেক্টকে নির্দিষ্ট ফাংশনালিটি ইমপ্লিমেন্ট করতে বাধ্য করে। কটলিনে interface কীওয়ার্ড ব্যবহার করে ইন্টারফেস ডিক্লেয়ার করা হয়। কটলিনে একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, যা মাল্টিপল ইনহেরিটেন্সের মতো কাজ করে।
Interface উদাহরণ:
interface Animal {
val name: String
fun sound()
fun eat() {
println("$name is eating.")
}
}
class Cat : Animal {
override val name: String = "Cat"
override fun sound() {
println("Meow")
}
}
ব্যাখ্যা:
Animalহলো একটি ইন্টারফেস যা একটি প্রোপার্টি (name), একটি ফাংশন (sound()), এবং একটি ডিফল্ট ফাংশন (eat()) ডিফাইন করে।Catক্লাসটিAnimalইন্টারফেস ইমপ্লিমেন্ট করে এবং এতে থাকা প্রোপার্টি এবং মেথডগুলো ওভাররাইড করে।
Interface ব্যবহার কেন?
- যখন আপনি চান একটি ক্লাস একাধিক ফাংশনালিটি ইমপ্লিমেন্ট করুক। কটলিনে একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে, কিন্তু একাধিক ক্লাস ইনহেরিট করতে পারে না।
- ইন্টারফেসে ডিফল্ট মেথডও থাকতে পারে যা প্রয়োজন অনুযায়ী ওভাররাইড করা যায়।
মাল্টিপল ইন্টারফেস ইমপ্লিমেন্ট করা:
interface Animal {
fun sound()
}
interface Pet {
fun play()
}
class Bird : Animal, Pet {
override fun sound() {
println("Chirp")
}
override fun play() {
println("Bird is playing")
}
}
Birdক্লাসটিAnimalএবংPetদুটি ইন্টারফেস ইমপ্লিমেন্ট করছে এবং তাদের মেথডগুলো ওভাররাইড করেছে।
Abstract Classes এবং Interfaces-এর পার্থক্য
| ফিচার | Abstract Class | Interface |
|---|---|---|
| ইনস্ট্যান্স তৈরি | ইনস্ট্যান্স তৈরি করা যায় না | ইনস্ট্যান্স তৈরি করা যায় না |
| মাল্টিপল ইনহেরিটেন্স | একটি ক্লাস একাধিক অ্যাবস্ট্রাক্ট ক্লাস ইনহেরিট করতে পারে না | একটি ক্লাস একাধিক ইন্টারফেস ইমপ্লিমেন্ট করতে পারে |
| প্রোপার্টি | প্রোপার্টি হোল্ড করতে পারে | শুধুমাত্র অ্যাবস্ট্রাক্ট প্রোপার্টি ঘোষণা করতে পারে |
| কন্সট্রাক্টর | কন্সট্রাক্টর থাকতে পারে | কন্সট্রাক্টর থাকতে পারে না |
| মেথড | অ্যাবস্ট্রাক্ট এবং নন-অ্যাবস্ট্রাক্ট মেথড থাকতে পারে | শুধুমাত্র অ্যাবস্ট্রাক্ট এবং ডিফল্ট মেথড থাকতে পারে |
উপসংহার
কটলিনে Abstract Classes এবং Interfaces অ্যাবস্ট্রাকশন এবং মডুলারিটি নিশ্চিত করতে সাহায্য করে। এগুলো ব্যবহার করে আপনি ক্লাসের মধ্যে সাধারণ ফাংশনালিটি শেয়ার করতে পারেন এবং একই সাথে নির্দিষ্ট ফাংশনালিটি প্রতিটি সাবক্লাস বা ইমপ্লিমেন্টিং ক্লাসে আলাদাভাবে তৈরি করতে পারেন।
Read more